package com.cmtime.proxy;
/**
 * 通过字节码技术生成被代理类的子类实现
 * 底层是通过asm字节码处理框架来转正字节码生成新的类（被代理类的子类），
 * 大部分功能实际上是ASM提供的，Cglib只是封装了ASM，简化了ASM操作，
 * 实现了运行期生产心的class。如上代码，在main函数中，getObject得到的对象实际上是User的子类，
 * 调用的work()方法，实际上是覆盖的父类User的work()方法。
 */
import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class CGlibDynamicProxy implements MethodInterceptor{

	private Enhancer enhancer = new Enhancer(); 
	
	@Override
	public Object intercept(Object obj, Method method, Object[] args,
			MethodProxy proxy) throws Throwable {
		System.out.println("方法执行前");
		Object result = proxy.invokeSuper(obj, args);
		System.out.println("方法执行后");
		return result;
	}

	public Object getObject(Class clz){
		enhancer.setSuperclass(clz);
		enhancer.setCallback(this);
		return enhancer.create();
	}
	
	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		for(int i=0;i<10000000;i++){
			Dog dog = new Dog();
			CGlibDynamicProxy proxy = new CGlibDynamicProxy();
			Animal animal = (Animal) proxy.getObject(dog.getClass());
			animal.work();
		}
		long end = System.currentTimeMillis();
		System.out.println(end - start);
	}
}
